﻿#define _CRT_SECURE_NO_WARNINGS 1
//#include <stdio.h>
//#include <stdlib.h>
//int main()
//{
//	int** p = (int**)malloc(3 * sizeof(int*));
//	for (int i = 0; i < 3; ++i)
//		p[i] = (int*)malloc(5 * sizeof(int));
//	// 初始化
//	for (int i = 0; i < 3; ++i)
//		for (int j = 0; j < 5; ++j)
//			p[i][j] = 5 * i + j;
//	// 打印
//	for (int i = 0; i < 3; ++i)
//	{
//		for (int j = 0; j < 5; ++j)
//			printf("%d ", p[i][j]);
//		printf("\n");
//	}
//	// 释放内存
//	for (int i = 0; i < 3; ++i)
//		free(p[i]);
//	free(p);
//	p = NULL;
//	return 0;
//}

//#include <stdio.h>
//int check_sys()
//{
//	union
//	{
//		int i;
//		char c;
//	}un;
//	un.i = 1;
//	return un.c;
//}
//int main()
//{
//	if (check_sys())
//		printf("小端\n");
//	else
//		printf("大端\n");
//	return 0;
//}

//#include <stdio.h>
////#include <stdlib.h>
//#include <assert.h>
//#include <ctype.h>
//#include <limits.h>
//enum state
//{
//	VAILD,
//	INVAILD
//}sta = INVAILD;
//
//int myatoi(const char* str)
//{
//	assert(str);
//	if (*str == '\0') return 0;
//	while (isspace(*str)) ++str;
//	// 假设是正号
//	int flag = 1;
//	if (*str == '+')
//	{
//		flag = 1;
//		++str;
//	}
//	if (*str == '-')
//	{
//		flag = -1;
//		++str;
//	}
//	// 判断字符 1.数字字符  2.非数字字符
//	long long ret = 0;
//	while (*str)
//	{
//		if (isdigit(*str))
//		{
//			ret = ret * 10 + flag * (*str - '0');
//			if (ret > INT_MAX) return INT_MAX;
//			else if (ret < INT_MIN) return INT_MIN;
//		}
//		else
//		{
//			return (int)ret;
//		}
//		++str;
//	}
//	if (*str == '\0') sta = VAILD;
//	return (int)ret;
//}
//int main()
//{
//	const char* str = "  -123a456";
//
//	printf("%d\n", myatoi(str));
//	if (sta == VAILD) printf("%s\n", "合法的转换.....");
//	else if (sta == INVAILD) printf("%s\n", "非法的转换....");
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a = 10000;
//	FILE * pf = fopen("test.txt", "wb");
//	fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	// 打开文件
//	FILE* pf = fopen("./../../data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	// 读文件
//
//	// 关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	// 打开文件
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	// 写文件
//	/*fputc('a', pf);
//	fputc('b', pf);
//	fputc('c', pf);
//	fputc('d', pf);
//	fputc('e', pf);*/
//	for (int i = 'a'; i <= 'z'; ++i)
//	{
//		fputc(i, pf);
//	}
//	// 关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	// 打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	// 读文件
//	/*int c = fgetc(pf);
//	printf("%c\n", c);
//
//	c = fgetc(pf);
//	printf("%c\n", c);
//
//	c = fgetc(pf);
//	printf("%c\n", c);
//
//	c = fgetc(pf);
//	printf("%c\n", c);*/
//
//	int c = 0;
//	while ((c = fgetc(pf)) != EOF)
//	{
//		//printf("%c-", c);
//		putchar(c);
//		putchar('-');
//	}
//	// 关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int c = fgetc(stdin);
//	//printf("%c\n", c);
//	//putchar(c);
//	fputc(c, stdout);
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	// 打开文件
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	// 写文件
//	fputs("i like C\n", pf);
//	fputs("hello world\n", pf);
//	// 关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	// 打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	// 读文件
//	char arr[20] = { 0 };
//	fgets(arr, 20, pf);
//	printf("%s", arr);
//
//	fgets(arr, 20, pf);
//	printf("%s", arr);
//	// 关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char arr[20] = { 0 };
//	fgets(arr, 5, stdin);
//	fputs(arr, stdout);
//	return 0;
//}

//#include <stdio.h>
//struct S
//{
//	char name[20];
//	int age;
//	double math;
//};
//int main()
//{
//	// 打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	struct S s;
//	// 读文件
//	fscanf(stdin, "%s %d %lf", s.name, &(s.age), &(s.math));
//	fprintf(stdout, "%s %d %lf", s.name, s.age, s.math);
//	// 关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//
//#include <stdio.h>
//int main()
//{
//	// 打开文件
//	FILE* pf = fopen("data.txt", "wb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	// 写文件
//	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//	fwrite(arr, sizeof(int), 10, pf);
//	// 关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	// 打开文件
//	FILE* pf = fopen("data.txt", "rb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	// 读文件
//	int arr[10] = { 0 };
//	fread(arr, sizeof(int), 10, pf);
//	for (int i = 0; i < 10; ++i)
//		printf("%d ", arr[i]);
//	printf("\n");
//	// 关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char name[] = "zhangsan";
//	int age = 20;
//	double math = 95.5;
//	char buf[50] = { 0 };
//	sprintf(buf, "%s- %d-%.1lf", name, age, math);
//	printf("%s\n", buf);
//
//	char name2[20] = "";
//	int age2 = 0;
//	double math2 = 0;
//
//	sscanf(buf, "%s %d %lf", name2, &age2, &math2);
//	printf("%s %d %lf", name2, age2, math2);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	// 打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	// 读文件
//	int c = fgetc(pf);
//	printf("%c\n", c);
//
//	fseek(pf, -7, SEEK_END);
//	c = fgetc(pf);
//	printf("%c\n", c);
//
//	rewind(pf);
//	c = fgetc(pf);
//	printf("%c\n", c);
//	// 关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	FILE* pFile;
//	pFile = fopen("example.txt", "wb");
//	fputs("This is an apple.", pFile);
//	fseek(pFile, 9, SEEK_SET);
//	fputs(" sam", pFile);
//	printf("%d\n", ftell(pFile));
//	fclose(pFile);
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	FILE* pFile;
//	long size;
//	pFile = fopen("data.txt", "rb");
//	if (pFile == NULL)
//		perror("Error opening file");
//	else
//	{
//		fseek(pFile, 0, SEEK_END); // non-portable
//		size = ftell(pFile);
//		fclose(pFile);
//		printf("Size of myfile.txt: %ld bytes.\n", size);
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <stdlib.h>
//int main(void)
//{
//	int c; // 注意：int，⾮char，要求处理EOF
//	FILE* fp = fopen("data.txt", "w");
//	if (!fp) {
//		perror("File opening failed");
//		return EXIT_FAILURE;
//	}
//	//fgetc 当读取失败的时候或者遇到⽂件结束的时候，都会返回EOF
//	while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环
//	{
//		putchar(c);
//	}
//	//判断是什么原因结束的
//	if (ferror(fp))
//		puts("I/O error when reading");
//	else if (feof(fp))
//		puts("End of file reached successfully");
//	fclose(fp);
//}


//#include <stdio.h>
//enum { SIZE = 5 };
//int main(void)
//{
//	double a[SIZE] = { 1.,2.,3.,4.,5. };
//	FILE* fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式
//	fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组
//	fclose(fp);
//	double b[SIZE];
//	fp = fopen("test.bin", "rb");
//	size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读 double 的数组
//	if (ret_code == SIZE) {
//		puts("Array read successfully, contents: ");
//		for (int n = 0; n < SIZE; ++n)
//			printf("%f ", b[n]);
//		putchar('\n');
//	}
//	else { // error handling
//		if (feof(fp))
//			printf("Error reading test.bin: unexpected end of file\n");
//		else if (ferror(fp)) {
//			perror("Error reading test.bin");
//		}
//	}
//	fclose(fp);
//}

//#include <stdio.h>
//int main()
//{
//	// 打开文件
//	FILE* pr = fopen("data.txt", "r");
//	if (pr == NULL)
//	{
//		perror("打开文件失败 -r");
//		return;
//	}
//	FILE* pw = fopen("data_copy.txt", "w");
//	if (pw == NULL)
//	{
//		perror("打开文件失败 -w");
//		return 1;
//	}
//	// 读写文件
//	// fread/fwrite
//	char arr[20] = { 0 };
//	fread(arr, sizeof(char), 20, pr);
//	fwrite(arr, sizeof(char), 20, pw);
//	// 关闭文件
//	fclose(pr);
//	pr = NULL;
//	fclose(pw);
//	pw = NULL;
//	return 0;
//}

// 用C语言编写一个使用fread和fwrite函数拷贝文件的程序
#include <stdio.h>
#include <stdlib.h>

#define BUFFER_SIZE 1024  // 定义缓冲区大小

int main() {
    FILE* source_file, * target_file;
    char buffer[BUFFER_SIZE];
    size_t bytes_read;

    // 1. 打开源文件data.txt（读取模式）
    source_file = fopen("data.txt", "rb");
    if (source_file == NULL) 
    {
        printf("无法打开源文件 data.txt\n");
        return 1;
    }

    // 2. 打开目标文件data_copy.txt（写入模式）
    target_file = fopen("data_copy.txt", "wb");
    if (target_file == NULL) 
    {
        printf("无法创建目标文件 data_copy.txt\n");
        fclose(source_file);
        return 1;
    }

    // 3. 使用fread和fwrite拷贝文件内容
    while ((bytes_read = fread(buffer, 1, BUFFER_SIZE, source_file)) > 0) 
    {
        size_t bytes_written = fwrite(buffer, 1, bytes_read, target_file);
        if (bytes_written != bytes_read) 
        {
            printf("写入文件时发生错误\n");
            break;
        }
    }

    // 4. 关闭两个文件
    fclose(source_file);
    fclose(target_file);

    printf("文件拷贝完成！data.txt 已拷贝为 data_copy.txt\n");

    return 0;
}